def concatenate_and_remove_duplicates(s1, s2):
    """拼接两个字符串并去除重复字符 但保留字符的原始出现顺序 (即第一个出现的字符保留，后续重复的字符被过滤）。”"""
    combined = s1 + s2
    unique_chars = []
    seen = set()
    for char in combined:
        if char not in seen:
            seen.add(char)
            #问题：都有set了，可以实现去重了，为什么还要unique_chars对象？
            #答：set在这里的作用是快速判断字符是否重复（利用in操作的时间复杂度是O(1)。它解决了 “如何高效记录已出现字符” 的问题，但set本身无法保证字符的 “原始顺序” set是无序集合，会打乱字符的遍历顺序。
            #而 unique_chars 列表会按字符在拼接字符串中第一次出现的顺序存储字符，最终通过 ''.join(unique_chars) 得到 “去重且保序” 的结果。
            unique_chars.append(char)
    return ''.join(unique_chars)
    #总结
    # set 负责 “高效判重”，unique_chars 负责 “保留原始顺序”。两者配合才能实现"去重且保持字符出现的先后顺序"的需求，这是仅用 set 无法完成的。

# 测试
if __name__ == "__main__":
    s1 = "abc"
    s2 = "bcd"
    print(concatenate_and_remove_duplicates(s1, s2))  # 输出: abcd